import axios, { AxiosInstance, AxiosRequestConfig } from 'axios';
import { MessageBox } from 'element-ui';
import { eachProp } from '@/utils/Object';
import { isNull } from '@/utils/Common';
import { removeToken, removeTokenToname } from '@/utils/auth';
// import { now } from '@/utils/Date';
import router from '@/router/index.js';

const service: AxiosInstance = axios.create({
    baseURL: '/', // api的base_url
    timeout: 30000, // 请求超时时间
});

// interface window {
//     test: string
// }


/**
 * get请求，将request中的data，包装到url上
 */
function wrapParamUrl(originUrl: string | undefined, data: any) {
    let url = `${originUrl}?`;
    if (data) {
        eachProp(data, (prop) => {
            if (!isNull(data[prop])) {
                url += `${prop}=${data[prop].toString()}&`;
            }
        });
    }
    // 删除url中最后拼接的&
    url = url.substring(0, url.length - 1);
    return url;
}

// request拦截器
service.interceptors.request.use((originConfig: AxiosRequestConfig) => {
    const config = originConfig;
    const method = String(config.method).toUpperCase();
    if (method === 'POST') { // 对表单数据不进行压缩处理或添加额外校验参数
        // 判断是否是登录请求
        // console.log("456789");
        // if(config.url == "/nebula/sys/login"){

        // }else{

        // }
        // if (config.data instanceof FormData) {
        //   return config;
        // }
        // // 压缩空格，阻止用户输入的冗余空格符，允许输入空格的地方用特殊字符代替
        // if(config.data){
        //   config.data = JSON.stringify(config.data).replace(/\s+/g, ' ').replace(/%#%/g, ' ');
        // }
        // config.data = {
        //   version: '1.0.0',
        //   reqDateTime: now('YYYY-MM-DDTHH:mm:ss'),
        //   data: config.data?JSON.parse(config.data):'',
        // };
    } else if (method === 'GET') { // 将data中的参数拼接到url中
        config.url = wrapParamUrl(config.url, config.data);
    }
    return config;
}, error => Promise.reject(error));

declare let window: any;
window.timeOutFlag = false;
// response拦截器
service.interceptors.response.use((response) => {
    // 登录超时
    if (response.data.msg === '-10000') { // 登录超时
        // 请求完成 抛出请求到的数据 不考虑 请求到的数据是成功数据 还是失败数据 还是请求成但 没有数据
        if (window.timeOutFlag) return Promise.reject(response);
        // 清除浏览器缓存用户信息
        localStorage.clear();
        sessionStorage.clear();
        removeToken();
        removeTokenToname();
        // 清楚软电话缓存数据
        if (window.softphone) {
            window.softphone.clearSession('1');
            window.softphone.clearAllSession();
        }
        window.timeOutFlag = true;
        MessageBox({
            title: '提示',
            message: '登录超时，请重新登录！',
            // type: 'error',
            closeOnClickModal: false,
            customClass: 'error', type: 'error',
            showClose: false,
        }).then(() => {
            router.push('/login');
        });
    }
    // 其他情况直接返回 后台请求到的数据
    return response;
},
    // 接口错误状态处理，无响应时的错误处理
    error => Promise.reject(error));
export default service;
